package main

import (
	"fmt"
	"reflect"
)

type HandlerFunc0 func(int) int

func Pow(next HandlerFunc0) HandlerFunc0 {
	return func(b int) int {
		return next(b * b)
	}
}

func Add(next HandlerFunc0) HandlerFunc0 {
	return func(i int) int {
		return next(i + 1)
	}
}

func Multi10(next HandlerFunc0) HandlerFunc0 {
	return func(i int) int {
		return next(i * 10)
	}
}

func Identity() HandlerFunc0 {
	return func(i int) int {
		return i
	}
}

func main() {

	zero := HandlerFunc0(func(val int) int {
		return 0
	})

	fmt.Println(reflect.TypeOf(zero))
	fmt.Println(reflect.TypeOf(Pow))

	op := Pow(Add(Multi10(Identity())))

	fmt.Println(op(2))

}
